#ifndef _MATRIX_GRAPH_H
#define _MATRIX_GRAPH_H


#include "Graph.h"

class MatrixGraph : public Graph {

 private:

  unordered_set<int>* freeEntries;
  unordered_set<int>* usedEntries;

  int checkVertex( string v );
  Edge* adjMatrix [MAXVERTICES][MAXVERTICES];
  unordered_map<string, Vertex *> * vertices;

 public:

  MatrixGraph();
  ~MatrixGraph();

  int containsEdge( string  src, string dest );
  int containsVertex (string ID);
  void insertEdge( string src, string  dest, int weight = 1, string label = "" );
  void removeEdge( string src, string  dest ) ;

  Vertex * insertVertex( string label = "" );

  void removeVertex( string vertex );

  Edge * getEdge(string src, string dest);

  vector < Vertex * > * getNeighbors( string src );
  vector < Edge * > * getOutgoingEdges( string src );
  vector < Edge * > * getIncomingEdges( string src );
  Vertex * getVertex(string v);
  int consistencyCheck();
  int size();
  
  vector < Vertex * > * getAllVertices();
  vector < Edge * > * getAllEdges();

};




#endif 
